home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1995 #3 & #4 / Amiga Plus CD - 1995 - No. 3 and 4.iso / pd / sound / cybersound / 14bit.driver / source / library.c < prev    next >
C/C++ Source or Header  |  1995-07-20  |  4KB  |  178 lines

  1.  
  2. /*****************************************************************************
  3.  *
  4.  * CyberSound: 14 Bit sound driver
  5.  *
  6.  * (c) 1995 by Christian Buchner
  7.  *
  8.  *****************************************************************************
  9.  *
  10.  * Library.c
  11.  */
  12.  
  13. #include "driverbase.h"
  14.  
  15. #undef IntuitionBase
  16. #undef GfxBase
  17.  
  18.  
  19. /*****************************************************************************/
  20.  
  21. struct Library *__asm LibInit (register __d0 struct DriverBase *db, register __a0 BPTR seglist, register __a6 struct Library * sysbase);
  22.  
  23. UBYTE LibName[]="14bit.driver";
  24. UBYTE Version[]={'$','V','E','R',':',' '};
  25. UBYTE LibId[]="14bit.driver 1.1 "__AMIGADATE__" by Christian Buchner\n";
  26.  
  27. extern UWORD LibFuncTable[];
  28. extern UWORD LibDataTable[];
  29.  
  30. ULONG LibInitTable[]=
  31. {
  32.     (ULONG)sizeof(struct DriverBase),
  33.     (ULONG)LibFuncTable,
  34.     (ULONG)LibDataTable,
  35.     (ULONG)&LibInit
  36. };
  37.  
  38.  
  39. /*****************************************************************************/
  40.  
  41. struct Library *__asm LibInit (register __d0 struct DriverBase *db, register __a0 BPTR seglist, register __a6 struct Library * sysbase)
  42. {
  43.     SegList = seglist;
  44.     
  45.     return (struct Library*) db;
  46. }
  47.  
  48. /*****************************************************************************/
  49.  
  50. LONG __asm LibOpen (register __a6 struct DriverBase *db)
  51. {
  52.     LONG retval = NULL;
  53.     
  54.     Forbid();
  55.     
  56.     /* This library can only be opened once */
  57.     
  58.     if (db->db_Lib.lib_OpenCnt == 0)
  59.     {
  60.         /* Open Intuition and Gfx */
  61.         
  62.         if (db->db_DOSBase=(struct DosLibrary*)OpenLibrary("dos.library",37))
  63.         {
  64.             if (db->db_IntuitionBase=(struct IntuitionBase*)OpenLibrary("intuition.library",37))
  65.             {
  66.                 if (db->db_GfxBase=(struct GfxBase*)OpenLibrary("graphics.library",37))
  67.                 {
  68.                     /* Verify size of library base */
  69.                     
  70.                     if (db->db_Lib.lib_PosSize==sizeof(struct DriverBase))
  71.                     {
  72.                         /* Init driver */
  73.                         
  74.                         if (InitDriver(db))
  75.                         {
  76.                             /* success */
  77.                             db->db_Lib.lib_OpenCnt++;
  78.                             db->db_Lib.lib_Flags &= ~LIBF_DELEXP;
  79.                             retval = (LONG) db;
  80.                         }
  81.                     }
  82.                 }
  83.             }
  84.         }
  85.         /* On failure, close Gfx and Intuition */
  86.         
  87.         if (!retval)
  88.         {
  89.             if (db->db_GfxBase)
  90.             {
  91.                 CloseLibrary((struct Library*)db->db_GfxBase);
  92.                 db->db_GfxBase=NULL;
  93.             }
  94.             if (db->db_IntuitionBase)
  95.             {
  96.                 CloseLibrary((struct Library*)db->db_IntuitionBase);
  97.                 db->db_IntuitionBase=NULL;
  98.             }
  99.             if (db->db_DOSBase)
  100.             {
  101.                 CloseLibrary((struct Library*)db->db_DOSBase);
  102.                 db->db_DOSBase=NULL;
  103.             }
  104.         }
  105.     }
  106.     
  107.     Permit();
  108.     
  109.     return (retval);
  110. }
  111.  
  112. /*****************************************************************************/
  113.  
  114. LONG __asm LibClose (register __a6 struct DriverBase *db)
  115. {
  116.     LONG retval = NULL;
  117.     
  118.     Forbid();
  119.     
  120.     if (db->db_Lib.lib_OpenCnt) db->db_Lib.lib_OpenCnt--;
  121.     
  122.     if (db->db_Lib.lib_OpenCnt == 0)
  123.     {
  124.         /* Deinit driver */
  125.         
  126.         DeInitDriver(db);
  127.         
  128.         /* Close Gfx and Intuition */
  129.         
  130.         if (db->db_GfxBase)
  131.         {
  132.             CloseLibrary((struct Library*)db->db_GfxBase);
  133.             db->db_GfxBase=NULL;
  134.         }
  135.         if (db->db_IntuitionBase)
  136.         {
  137.             CloseLibrary((struct Library*)db->db_IntuitionBase);
  138.             db->db_IntuitionBase=NULL;
  139.         }
  140.         if (db->db_DOSBase)
  141.         {
  142.             CloseLibrary((struct Library*)db->db_DOSBase);
  143.             db->db_DOSBase=NULL;
  144.         }
  145.     }
  146.     
  147.     if (db->db_Lib.lib_Flags & LIBF_DELEXP) retval = LibExpunge (db);
  148.     
  149.     Permit();
  150.     
  151.     return (retval);
  152. }
  153.  
  154. /*****************************************************************************/
  155.  
  156. LONG __asm LibExpunge (register __a6 struct DriverBase *db)
  157. {
  158.     BPTR seg = SegList;
  159.     
  160.     if (db->db_Lib.lib_OpenCnt)
  161.     {
  162.         db->db_Lib.lib_Flags |= LIBF_DELEXP;
  163.         return (NULL);
  164.     }
  165.     
  166.     Remove ((struct Node *) db);
  167.     
  168.     FreeMem ((APTR)((ULONG)(db) - (ULONG)(db->db_Lib.lib_NegSize)), (ULONG)(db->db_Lib.lib_NegSize + db->db_Lib.lib_PosSize));
  169.     
  170.     return ((LONG) seg);
  171. }
  172.  
  173. /*****************************************************************************/
  174.  
  175. void __asm LibReserved(register __a6 struct DriverBase *db)
  176. {
  177. }
  178.